package com.aiwiown.snackmq.common.handler;

import com.aiwiown.snackmq.common.message.Message;
import lombok.Getter;

import java.nio.ByteBuffer;
import java.util.List;

/**
 * 封装了单次请求的所有上下文信息。
 * 它现在持有一个抽象的 ResponseWriter，而不是一个具体的 Netty ChannelHandlerContext，
 * 从而实现了业务逻辑与网络层的完全解耦。
 */
@Getter
public class RequestContext {

    // --- 关键修复：将具体实现替换为抽象接口 ---
    private final ResponseWriter responseWriter; // 负责处理响应写入的抽象接口
    private final Message requestMessage;        // 请求消息对象
    /**
     * 【新增】底层的网络通道对象。
     * 在 broker 模块中，它将是 io.netty.channel.Channel 的实例。
     */
    private final Object channel;

    /**
     * 兼容旧代码的构造函数。
     */
    public RequestContext(ResponseWriter responseWriter, Message requestMessage) {
        this(responseWriter, requestMessage, null);
    }

    /**
     * 【新增】增强的构造函数。
     *
     * @param responseWriter 响应写入器
     * @param requestMessage 请求消息
     * @param channel        网络通道对象
     */
    public RequestContext(ResponseWriter responseWriter, Message requestMessage, Object channel) {
        this.responseWriter = responseWriter;
        this.requestMessage = requestMessage;
        this.channel = channel;
    }


    /**
     * 便利方法，用于向客户端写入响应。
     *
     * @param response 要写入的响应消息
     */
    public void writeResponse(Message response) {
        if (this.responseWriter != null) {
            this.responseWriter.writeResponse(response);
        }
    }

    /**
     * 【新增】向客户端发送一个零拷贝响应。
     * 这个方法将调用委托给 ResponseWriter，由其负责将原始的 ByteBuffer 列表高效地写入网络。
     *
     * @param messageId 对应原始请求的消息ID。
     * @param buffers   包含原始消息数据的 ByteBuffer 列表。
     */
    public void writeZeroCopyResponse(long messageId, List<ByteBuffer> buffers) {
        // 委托给 ResponseWriter 处理零拷贝响应的写入
        responseWriter.writeZeroCopyResponse(messageId, buffers);
    }
}